/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package sueca2011;

import java.util.ArrayList;
import java.util.Iterator;

/**
 *
 * @author hugo
 */
public class Nivel2 extends Nivel1{
    public Nivel2(String nome){
        super(nome);
    }

    protected ArrayList<Carta> getCartasValidas(){
        System.out.println("Validas nivel 2");
        ArrayList<Carta> validas = new ArrayList<Carta>();
        Iterator<Carta> it = cartasNaMao.iterator();
        Carta c;
        while(it.hasNext()){
            c = it.next();
            if(this.validaCarta(c) && c.getNipe()!=super.trunfo.getNipe()){
                validas.add(c);
            }
        }
        if(validas.isEmpty())
            return super.getCartasValidas();
        else
            return validas;
    }

    protected int contaPontosNaMesa(){
        int pts=0;
        for(int i=0;i<posRodada;i++)
            pts+=Jogo.valorCarta(mesaRodada[i].getCartaJogada());
        return pts;
    }

    protected ArrayList<Carta> getMeusTrunfos(){
        ArrayList<Carta> trunfos = new ArrayList<Carta>();
        Iterator<Carta> it = cartasNaMao.iterator();
        Carta c;
        while(it.hasNext()){
            c = it.next();
            if(c.getNipe()==super.trunfo.getNipe()){
                trunfos.add(c);
            }
        }
        return trunfos;
    }

    protected Carta getMelhorCarta(Carta cmp){
        Iterator<Carta> it = getCartasValidas().iterator();
        ArrayList<Carta> candidatas = new ArrayList<Carta>();
        Carta tmp=null;
        Carta carta=null;
        int num;
        boolean temMaior;
        while(it.hasNext()){
            tmp = it.next();
            if(comparaCartas(tmp, cmp)>0)
                candidatas.add(tmp);
        }

        it = candidatas.iterator();
        while(it.hasNext()){
            tmp = it.next();
            num = tmp.getNumero();
            temMaior=false;
            for(int i=num-1;i>=0;i--)
                if(super.jaFoiJogada(tmp.getNipe(), i)==0)
                    temMaior = true;
            if(!temMaior){
                if(carta==null || (carta!=null && carta.getNumero()>tmp.getNumero()))
                    carta = tmp;
            }
        }

        return carta;
    }

    protected int contaCartasDoNipeEmJogo(int nipe){
        int count = contagemNipes[nipe];
        Iterator<Carta> mao = cartasNaMao.iterator();
        Carta tmp;
        while(mao.hasNext()){
            tmp = mao.next();
            if(tmp.getNipe()==nipe)
                count++;
        }
        return 10-count;
    }

    protected Carta getCartaMaiorValor(){
        Iterator<Carta> it = getCartasValidas().iterator();
        Carta tmp=null;
        Carta carta=null;
        int num;
        boolean temMaior;
        while(it.hasNext()){
            tmp = it.next();
            if(carta==null || Jogo.valorCarta(tmp)>Jogo.valorCarta(carta)){
                num = tmp.getNumero();
                if(contaCartasDoNipeEmJogo(tmp.getNipe())>4){
                    temMaior=false;
                    for(int i=num-1;i>=0;i--)
                        if(super.jaFoiJogada(tmp.getNipe(), i)==0)
                            temMaior = true;
                    if(!temMaior)
                        carta = tmp;
                }else{
                    System.out.println("Nao vou jogar "+tmp+" pois poderei ser cortado!");
                }
            }
        }
        return carta;
    }

    protected Carta getMeuTrunfoVencedor(Carta carta){
        Iterator<Carta> it = cartasNaMao.iterator();
        Carta c;
        Carta melhor=null;
        while(it.hasNext()){
            c = it.next();
            if(c.getNipe()==super.trunfo.getNipe() && comparaCartas(c, carta)>0){
                if(melhor==null)
                    melhor = c;
                else if(comparaCartas(c, melhor)<0)
                    melhor = c;
            }
        }
        return melhor;
    }

    protected Carta avaliaCorte(){
        Carta carta=null;
        if(posRodada>0){
            if(!super.temCartaComPuxada(mesaRodada[0].getCartaJogada().getNipe())){
                switch(posRodada){
                    case 1:
                        if(this.contaPontosNaMesa()>0){
                            carta = getMeuTrunfoVencedor(mesaRodada[0].getCartaJogada());
                        }
                        break;
                    case 2:
                        if(comparaCartas(mesaRodada[0].getCartaJogada(), mesaRodada[1].getCartaJogada())<0){
                            if(this.contaPontosNaMesa()>0){
                                carta = getMeuTrunfoVencedor(mesaRodada[1].getCartaJogada());
                            }
                        }
                        break;
                    case 3:
                        if(comparaCartas(mesaRodada[1].getCartaJogada(), mesaRodada[0].getCartaJogada())<0 || comparaCartas(mesaRodada[1].getCartaJogada(), mesaRodada[2].getCartaJogada())<0){
                            //Meu time perdendo
                            if(contaPontosNaMesa()>0){
                                if(comparaCartas(mesaRodada[0].getCartaJogada(), mesaRodada[2].getCartaJogada())>0)
                                    carta = getMeuTrunfoVencedor(mesaRodada[0].getCartaJogada());
                                else
                                    carta = getMeuTrunfoVencedor(mesaRodada[2].getCartaJogada());    
                            }
                        }
                        break;
                }
            }
        }
        if(carta==null)
            System.out.println("Nao cortar");
        else
            System.out.println("Cortar");
        return carta;
    }

    protected Carta escolhePos0(){
        System.out.println("IA(2) caso 0");
        Carta carta = getCartaMaiorValor();
        if(carta==null)
            carta = getCartaMenorValor();
        return carta;
    }

    protected Carta escolhePos1(){
        Carta carta=null;
        System.out.println("IA(2) caso 1");
        if((carta = avaliaCorte())==null){
            carta = getMelhorCarta(mesaRodada[0].getCartaJogada());
            if(carta==null || comparaCartas(carta,mesaRodada[0].getCartaJogada())<0)
                carta = getCartaMenorValor();
        }
        return carta;
    }

    protected Carta escolhePos2(){
        Carta carta=null;
        System.out.println("IA(2) caso 2");
        if((carta = avaliaCorte())==null){
            if(comparaCartas(mesaRodada[0].getCartaJogada(), mesaRodada[1].getCartaJogada())>0){
                carta  = super.getCartaMaiorValor();
            }else{
                carta = getMelhorCarta(mesaRodada[1].getCartaJogada());
                if(carta==null || comparaCartas(carta,mesaRodada[1].getCartaJogada())<0)
                    carta = getCartaMenorValor();
            }
        }
        return carta;
    }

    protected Carta escolhePos3(){
        Carta carta=null;
        System.out.println("IA(2) caso 3");
        if((carta = avaliaCorte())==null){
            if(comparaCartas(mesaRodada[1].getCartaJogada(), mesaRodada[0].getCartaJogada())>0 && comparaCartas(mesaRodada[1].getCartaJogada(), mesaRodada[2].getCartaJogada())>0){
                carta  = super.getCartaMaiorValor();
            }else{
                carta = getMelhorCarta();
                if(comparaCartas(carta,mesaRodada[0].getCartaJogada())<0 || comparaCartas(carta,mesaRodada[2].getCartaJogada())<0)
                    carta = getCartaMenorValor();
            }
        }
        return carta;
    }

    protected synchronized void escolheJogada() {
        Carta carta=null;
        System.out.println("IA escolhendo...");
        switch(posRodada){
            case 0:
                carta = escolhePos0();
                break;
            case 1:
                carta = escolhePos1();
                break;
            case 2:
                carta = escolhePos2();
                break;
            case 3:
                carta = escolhePos3();
                break;
        }

        if(carta==null){
            System.out.println("IA nao conseguiu escolher uma jogada, chamando nivel inferior!");
            super.escolheJogada();
        }else{
            this.jogadaAtual = new Jogada(this, carta);
            System.out.println("Carta escolhida pela IA: "+this.jogadaAtual.getCartaJogada());
        }
    }

}
